﻿using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace JESAI.DynamicWebApi.Helpers
{
    /// <summary>
    /// Type帮助类
    /// </summary>
    internal static class TypeHelper
    {
        /// <summary>
        /// 判断Type类型是基本类型包括可空类型
        /// </summary>
        /// <param name="type"></param>
        /// <param name="includeEnums"></param>
        /// <returns></returns>
        public static bool IsPrimitiveExtendedIncludingNullable(Type type, bool includeEnums = false)
        {
            //判断类型是否是基本类型，如果包含枚举返回false
            if (IsPrimitiveExtended(type, includeEnums))
            {
                return true;
            }

            //如果是可空的泛型，则取这个类型的泛型里面的第一个参数判断，因为同一个泛型所有参数都应该是同一种类型
            if (type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
            {
                return IsPrimitiveExtended(type.GenericTypeArguments[0], includeEnums);
            }

            return false;
        }

        private static bool IsPrimitiveExtended(Type type, bool includeEnums)
        {
            //判断类型对象实例是否是基本类型(如int,string,long,double,float····)
            if (type.GetTypeInfo().IsPrimitive)
            {
                return true;
            }

            //是否检查枚举类型（是枚举返回true）
            if (includeEnums && type.GetTypeInfo().IsEnum)
            {
                return true;
            }

            return type == typeof(string) ||
                   type == typeof(decimal) ||
                   type == typeof(DateTime) ||
                   type == typeof(DateTimeOffset) ||
                   type == typeof(TimeSpan) ||
                   type == typeof(Guid);
        }


    }
}
